「為什麼要寫這麼多測試案例啊?加減乘除不是四個就夠了?而且除法測試裡面還多放了一個assertFailsWith
?」詩憶提問。
唯心聽到這個問題後不由得苦笑起來。「一帆風順固然是好,但那只是理想,真實世界往往一波三折。我就曾經見過一位乘客把健保卡拿出來刷車票錢,問公車司機為什麼刷不過。如果那個司機不理乘客或是回應不知道,乘客可能會和他吵起來或是檢舉他。」
「程式所在的世界也非常現實,所以對於一些失敗的情況也要預先做好準備。就像第一份作業不少同學交上來的程式連跑都不能跑,給零分會很輕鬆,但是現實是我必須一行一行看,對完成度比較高的同學給予比較高的成績。」唯心說完之後好似陷入那段痛苦的回憶,眼睛失去了光彩。
確信自己是加害者之一的詩憶摩挲著手指,不知道如何反應比較好。
靜寂下來的寢室裡,氣氛變得有些僵硬。
詩憶眼神游移不定,突然瞥見桌上的杯子,腦中靈光一閃,從背包拿出兩瓶果汁,將一瓶遞給唯心。「學姐一定口渴了吧,這瓶給妳。」
唯心呆楞的接過果汁,木然地轉開蓋子,蓋子上的水珠滴落到她的手背。冰涼的觸感嚇得她往後急退了幾步,站穩後向正在喝果汁的詩憶發出了警告。「飲料還是不要在筆電旁邊喝唷,灑上去就麻煩了。」
「了解。」詩憶把瓶蓋旋緊,放到遠離筆電的位置。
唯心回到原來的話題。「assertFailsWith
就是用來測試範例程式有沒有預測到失敗情況。大於符號和小於符號中間包的是失敗的類型。ArithmeticException
是指四則運算失敗,IllegalArgumentException
則是指放進了不合規則、四則運算以外的符號。」
唯心小心翼翼的喝了口果汁,關緊瓶子後繼續說:「所以如果養成先寫測試再寫程式的習慣,可以大幅度降低程式出問題的可能性。」
詩憶想了想,反問另一種情形:「如果先寫程式再寫測試的話呢?或是程式是由其他人寫好的?」
「那就可以利用測試覆蓋率功能,可以檢查有沒有沒測試到的地方。」唯心再次把游標移動到四則運算旁邊三角形的地方。
詩憶重看了一次顯示出的清單,在之前的Run 四則運算測試
下方有一個Run 四則運算測試 with Coverage
。
詩憶提議:「既然這樣的話,以後都跑這個覆蓋率測試,不需要原本的測試吧?」
唯心搖搖頭。「妳比較一下兩者花費的時間就知道為什麼不會每次都檢測覆蓋率了。」
「⋯⋯將近七倍的時間。」詩憶目瞪口呆。
「現在我把覆蓋率降低給妳看。」唯心回到詩憶旁邊,修改了例外測試的程式碼。
// @Test
// fun 例外測試() {
// assertFailsWith<IllegalArgumentException> { 學號().四則運算(1, '?', 0) }
// }
「對了,順便介紹一下。程式碼可以在不刪除的情況下被略過,稱之為註解,方法是在前方加上雙斜線。」說完之後唯心就再次啟動了檢測覆蓋率功能。「妳看,覆蓋率行數的地方,是不是從100%降低到87%了?」
詩憶點點頭,記下了程式碼註解和測試覆蓋率的方法。